package com.blackhorse.controller;

import com.blackhorse.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Spring MVC响应相关
 */
@Controller
@RequestMapping("/user")
public class ReponseController {

    //返回类型为字符串
    @RequestMapping("/string")
    public String testString(Model model) {
        System.out.println("testString执行了...");
        //模拟从数据库查询User信息
        User user = new User();
        user.setName("用户1");
        user.setAge(12);

        model.addAttribute("user", user);
        return "response_success";
    }

    //返回类型为void，默认转发到请求路径同名的jsp，本例为void.jsp
    //如果想手动指定转发路径则需要使用Servlet原生API
    @RequestMapping("/void")
    public void testVoid(Model model) {
        System.out.println("testVoid执行了...");
        //模拟从数据库查询User信息
        User user = new User();
        user.setName("用户2");
        user.setAge(13);
        model.addAttribute("user", user);
        //默认转发到路径.jsp
    }


    //原生API可以进行转发、重定向或直接响应
    @RequestMapping("/void2")
    public void testVoid2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid2执行了...");
        //模拟从数据库查询User信息
        User user = new User();
        user.setName("用户3");
        user.setAge(14);

        //1.转发
        //原生转发方式不能用model对象存储信息
        request.setAttribute("user", user);
        //原生转发方式不能调用视图解析器，必须写完整路径
        request.getRequestDispatcher("/WEB-INF/pages/response_success.jsp").forward(request, response);

        //2.重定向，重定向不能访问WEB-INF下的页面
        //response.sendRedirect(request.getContextPath()+"/index.jsp");

        //3.直接响应
        //response.setContentType("text/html;charset=utf-8");
        //response.getWriter().println("<h2>响应成功</h2>");
    }

    //返回ModelAndView类型
    @RequestMapping("/mav")
    public ModelAndView testModelAndView() {
        System.out.println("testModelAndView执行了...");

        //模拟从数据库查询User信息
        User user = new User();
        user.setName("雄安");
        user.setAge(12);

        //创建ModelAndView
        ModelAndView mav = new ModelAndView();
        mav.addObject("user", user);//底层会把user存入request域
        mav.setViewName("response_success");//表示转发的视图
        return mav;
    }

    //使用关键字转发或重定向
    @RequestMapping("/far")
    public String testForwardOrRedirect(Model model) {
        System.out.println("testForwardOrRedirect执行了...");
        //模拟从数据库查询User信息
        User user = new User();
        user.setName("导3");
        user.setAge(33);
        model.addAttribute("user", user);
        //使用forward:关键字转发，不能使用视图解析器
        return "forward:/WEB-INF/pages/response_success.jsp";

        //使用redirect:关键字重定向（不加虚拟路径）
        //return "redirect:/index.jsp";
    }

    //异步响应json，SpringMVC会使用jackson（需要导入jar）自动封装请求参数的json数据
    @RequestMapping("/ajax")
    public @ResponseBody User testAjax(@RequestBody User user) {//获取请求体
        System.out.println("testAjax执行了...");
        System.out.println(user);

        //模拟从数据库查询User信息
        user.setName("新用户");
        user.setAge((int) (Math.random()*100));//随机数0-99

        //SpringMVC自动将ajax的返回对象转为json数据
        return user;
    }
}
